package com.k.kpp.config.datasource;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * @author kkk
 */
public class DynamicDataSourceContextHolder {
    /**
     * 当前使用的数据源，默认使用全局固定的数据源，如果变化，则默认使用全局修改的数据源，可以修改全局默认数据源，Controller不加任何标注
     * 如果Controller标注@DataSourceSwitch(value = "master") 则动态切换已存在的数据源
     */
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<String>() {
        /**
         * 将 master 数据源的 key作为默认数据源的 key
         */
        @Override
        protected String initialValue() {
            return GlobalDataSourceHolder.lookupKey;
        }
    };


    /**
     * 数据源的 key集合，用于切换时判断数据源是否存在
     */
    public static List<Object> dataSourceKeys = new ArrayList<>();

    /**
     * 切换数据源
     * @param key lookupKey
     */
    public static void setDataSourceKey(String key) {
        CONTEXT_HOLDER.set(key);
    }

    /**
     * 获取数据源
     * @return R
     */
    public static String getDataSourceKey() {
        return CONTEXT_HOLDER.get();
    }

    /**
     * 重置数据源
     */
    public static void clearDataSourceKey() {
        CONTEXT_HOLDER.remove();
    }

    /**
     * 判断是否包含数据源
     * @param key lookupKey
     * @return R
     */
    public static boolean containDataSourceKey(String key) {
        return dataSourceKeys.contains(key);
    }

    /**
     * 添加数据源keys
     * @param keys lookupKeys
     * @return R
     */
    public static boolean addDataSourceKeys(Collection<? extends Object> keys) {
        return dataSourceKeys.addAll(keys);
    }

    /**
     * 添加数据源 key
     * @param key lookupKey
     * @return R
     */
    public static boolean addDataSourceKey(Object key){
        return dataSourceKeys.add(key);
    }
}
